home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 9
/
The PC-SIG Library on CD ROM - Ninth Edition.iso
/
401_500
/
DISK0417
/
DISK0417.ZIP
/
PROLOG.ARC
/
LOGIC.ARC
/
SKOLEM.PRO
< prev
Wrap
Text File
|
1986-11-07
|
4KB
|
141 lines
translate(X) :-
implout(X,X1), /* Stage 1 */
negin(X1,X2), /* Stage 2 */
skolemiz(X2,X3,[]), /* Stage 3 */
univout(X3,X4), /* Stage 4 */
conjn(X4,X5), /* Stage 5 */
clausify(X5,Clauses,[]), /* Stage 6 */
pclauses(Clauses). /* Print out clauses */
implout((P <-> Q),((P1 & Q1) # (~P1 & ~Q1))) :- !,
implout(P,P1), implout(Q,Q1).
implout((P -> Q),(~P1 # Q1)) :- !,
implout(P,P1), implout(Q,Q1).
implout(all(X,P),all(X,P1)) :- !,
implout(P,P1).
implout(exists(X,P),exists(X,P1)) :- !,
implout(P,P1).
implout((P & Q),(P1 & Q1)) :- !,
implout(P,P1), implout(Q,Q1).
implout((P # Q),(P1 # Q1)) :- !,
implout(P,P1), implout(Q,Q1).
implout((~P),(~P1)) :- !,
implout(P1).
implout(P,P).
negin((~P),P1) :- !, neg(P,P1).
negin(all(X,P),all(X,P1)) :- !, negin(P,P1).
negin(exists(X,P),exists(X,P1)) :- !, negin(P,P1).
negin((P & Q),(P1 & Q1)) :- !, negin(P,P1), negin(Q,Q1).
negin((P # Q),(P1 # Q1)) :- !, negin(P,P1), negin(Q,Q1).
negin(P,P).
neg((~P),P1) :- !, negin(P,P1).
neg(all(X,P),exists(X,P1)) :- !, neg(P,P1).
neg(exists(X,P),all(X,P1)) :- !, neg(P,P1).
neg((P & Q),(P1 # Q1)) :- !, neg(P,P1), neg(Q,Q1).
neg((P # Q),(P1 & Q1)) :- !, neg(P,P1), neg(Q,Q1).
neg(P,(~P)).
skolemiz(all(X,P),all(X,P1),Vars) :- !, skolemiz(P,P1,[X|Vars]).
skolemiz(exists(X,P),P2,Vars) :- !,
gensym(f,F),
Sk =.. [F|Vars],
P =.. [Ph|Pt],
subsk(X,Sk,Pt,P1t),
P1 =.. [Ph|P1t],
skolemiz(P1,P2,Vars).
skolemiz((P # Q),(P1 # Q1),Vars) :- !,
skolemiz(P,P1,Vars), skolemiz(Q,Q1,Vars).
skolemiz((P & Q),(P1 & Q1),Vars) :- !,
skolemiz(P,P1,Vars), skolemiz(Q,Q1,Vars).
skolemiz(P,P,_).
subsk(_,_,[],[]).
subsk(X,A,[Y|L],[A|M]) :- X==Y ,subsk(X,A,L,M).
subsk(X,A,[Y|L],[Y|M]) :- X\==Y ,subsk(X,A,L,M).
univout(all(X,P),P1) :- !, univout(P,P1).
univout((P&Q),(P1&Q1)) :- !,
univout(P,P1), univout(Q,Q1).
univout((P#Q),(P1#Q1)) :- !,
univout(P,P1), univout(Q,Q1).
univout(P,P).
conjn((P#Q),R) :- !,
conjn(P,P1), conjn(Q,Q1), conjn1((P1#Q1),R).
conjn((P&Q),(P1&Q1)) :- !,
conjn(P,P1), conjn(Q,Q1).
conjn(P,P).
conjn1(((P&Q)#R),(P1&Q1)) :- !,
conjn((P#R),P1), conjn((Q#R),Q1).
conjn1((P#(Q&R)),(P1&Q1)) :- !,
conjn((P#Q),P1), conjn((P#R),Q1).
conjn1(P,P).
clausify((P&Q),C1,C2) :- !,
clausify(P,C1,C3), clausify(Q,C3,C2).
clausify(P,[cl(A,B)|Cs],Cs) :- inclause(P,A,[],B,[]), !.
clausify(_,C,C).
inclause((P#Q),A,A1,B,B1) :- !,
inclause(P,A2,A1,B2,B1), inclause(Q,A,A2,B,B2).
inclause((~P),A,A,B1,B) :- !,
notin(P,A), putin(P,B,B1).
inclause(P,A1,A,B,B) :- notin(P,B), putin(P,A,A1).
notin(X,[X|_]) :- !, fail.
notin(X,[_|L]) :- !, notin(X,L).
notin(X,[]).
putin(X,[],[X]) :- !.
putin(X,[X|L],L) :- !.
putin(X,[Y|L],[Y|L1]) :- putin(X,L,L1).
pclauses([]) :- !, nl, nl.
pclauses([cl(A,B)|Cs]) :- pclause(A,B), nl, pclauses(Cs).
pclause(L,[]) :- !, pdisj(L), print('.').
pclause([],L) :- !, print(':- '), pconj(L), print('.').
pclause(L1,L2) :- pdisj(L1), print(' :- '), pconj(L2),
print('.').
pdisj([L]) :- !, print(L).
pdisj([L|Ls]) :- print(L), print('; '), pdisj(Ls).
pconj([L]) :- !, print(L).
pconj([L|Ls]) :- print(L), print(', '), pconj(Ls).
/* Create a new atom starting with a root provided
and finishing with a unique number */
gensym(Root,Atom) :-
get_num(Root,Num),
name(Root,Name1),
integer_name(Num,Name2),
append(Name1,Name2,Name),
name(Atom,Name).
get_num(Root,Num) :- /* This root encountered before */
retract(current_num(Root,Num1)), !,
Num is Num1 + 1,
asserta(current_num(Root,Num)).
get_num(Root,1) :- /* First time for this root */
asserta(current_num(Root,1)).
/* Convert from an integer to a list of characters */
integer_name(Int,List) :- integer_name(Int,[],List).
integer_name(I,SoFar,[C|SoFar]) :- I < 10, !, C is I + 48.
integer_name(I,SoFar,List) :-
TopHalf is I / 10,
BotHalf is I mod 10,
C is BotHalf + 48,
integer_name(TopHalf,[C|SoFar],List).
append([],L,L).
append([X|L1],L2,[X|L3]) :- append(L1,L2,L3).